package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.CategoriaServicioDAO;
import mx.ipn.persistencia.dao.FactorDAO;
import mx.ipn.persistencia.dao.TipoServicioDAO;
import mx.ipn.to.FactorTO;
import mx.ipn.to.CategoriaServicioTO;
import mx.ipn.to.TipoServicioTO;

public class TipoServicioDAOMySQL implements TipoServicioDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(TipoServicioDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO tipo_servicio(id_categoria_servicio,id_subcategoria_servicio,id_factor) VALUES(?,?,?)";
	private static final String UPDATE = "UPDATE tipo_servicio SET id_categoria_servicio=?,id_subcategoria_servicio=?,id_factor=? WHERE id_tipo_servicio=?";
	private static final String FINDBYID = "SELECT * FROM tipo_servicio WHERE id_tipo_servicio=?";
	private static final String FINDBYCATEGORIASUBCATEGORIA = "SELECT * FROM tipo_servicio WHERE id_categoria_servicio=? and id_subcategoria_servicio=?";
	private static final String SELECT = "SELECT * FROM tipo_servicio";
	private static final String SELECTBYCATEGORIA = "SELECT * FROM tipo_servicio WHERE id_categoria_servicio=?";
	private static final String SELECTBYSUBCATEGORIA = "SELECT * FROM tipo_servicio WHERE id_subcategoria_servicio=?";
	private static final String SELECTBYFACTOR = "SELECT * FROM tipo_servicio WHERE id_factor=?";

	@Override
	public TipoServicioTO findTipoServicioByCategoriaSubCAtegoria(
			short idCategoriaServicio, short idSubCategoria) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(FINDBYCATEGORIASUBCATEGORIA);

			ps.setShort(1, idCategoriaServicio);
			ps.setShort(2, idSubCategoria);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				
				CategoriaServicioDAO categoriaServicioDAO = fabricaMySQL
						.getCategoriaServicioDAO();
				FactorDAO factorDAO = fabricaMySQL.getFactorDAO();

				TipoServicioTO tipoServicioTO = new TipoServicioTO(rs
						.getInt("id_tipo_servicio"), categoriaServicioDAO
						.findCategoriaServicioById(rs
								.getShort("id_categoria_servicio")),
						categoriaServicioDAO.findCategoriaServicioById(rs
								.getShort("id_categoria_servicio")), factorDAO
								.findFactorById(rs.getInt("id_factor")));

				ps.close();
				conexion.close();
				return tipoServicioTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}

	}

	@Override
	public TipoServicioTO findTipoServicioById(int idTipoServicio) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idTipoServicio);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				
				CategoriaServicioDAO categoriaServicioDAO = fabricaMySQL
						.getCategoriaServicioDAO();
				FactorDAO factorDAO = fabricaMySQL.getFactorDAO();

				TipoServicioTO tipoServicioTO = new TipoServicioTO(
						idTipoServicio, categoriaServicioDAO
								.findCategoriaServicioById(rs
										.getShort("id_categoria_servicio")),
						categoriaServicioDAO.findCategoriaServicioById(rs
								.getShort("id_subcategoria_servicio")), factorDAO
								.findFactorById(rs.getInt("id_factor")));

				ps.close();
				conexion.close();
				return tipoServicioTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertTipoServicio(TipoServicioTO tipoServicioTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setShort(1, tipoServicioTO.getCategoriaServicioTO()
					.getIdCategoriaServicio());
			ps.setShort(2, tipoServicioTO.getCategoriaServicioTO()
					.getIdCategoriaServicio());
			ps.setInt(3, tipoServicioTO.getFactorTO().getIdFactor());

			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<TipoServicioTO> selectTipoServicio() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;

			CategoriaServicioDAO categoriaServicioDAO = null;
			FactorDAO factorDAO = null;

			ArrayList<TipoServicioTO> tipoServicioTO = null;
			TipoServicioTO tipoServicioTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (tipoServicioTO == null) {
					tipoServicioTO = new ArrayList<TipoServicioTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					categoriaServicioDAO = fabricaMySQL
							.getCategoriaServicioDAO();
					factorDAO = fabricaMySQL.getFactorDAO();
				}

				tipoServicioTO2 = new TipoServicioTO(rs
						.getInt("id_tipo_servicio"), categoriaServicioDAO
						.findCategoriaServicioById(rs
								.getShort("id_categoria_servicio")),
						categoriaServicioDAO.findCategoriaServicioById(rs
								.getShort("id_subcategoria_servicio")), factorDAO
								.findFactorById(rs.getInt("id_factor")));

				tipoServicioTO.add(tipoServicioTO2);
				System.out.println("0000000000000000000000000000000000000000000000000000000000000000000000  "+ tipoServicioTO.size());
			}
			ps.close();
			conexion.close();
			return tipoServicioTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public TipoServicioTO selectTipoServicioByCategoriaServicio(
			short idCategoriaServicio) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			CategoriaServicioDAO categoriaServicioDAO = null;
			FactorDAO factorDAO = null;

			ArrayList<Integer> listIdTipoServicio = null;

			ArrayList<CategoriaServicioTO> listSubCategoriaTO = null;
			ArrayList<FactorTO> listFactorTO = null;

			TipoServicioTO tipoServicioTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYCATEGORIA);
			ps.setShort(1, idCategoriaServicio);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdTipoServicio == null) {

					listIdTipoServicio = new ArrayList<Integer>();

					listSubCategoriaTO = new ArrayList<CategoriaServicioTO>();
					listFactorTO = new ArrayList<FactorTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					categoriaServicioDAO = fabricaMySQL
							.getCategoriaServicioDAO();
					factorDAO = fabricaMySQL.getFactorDAO();
				}

				listIdTipoServicio.add(rs.getInt("id_tipo_servicio"));
				listSubCategoriaTO.add(categoriaServicioDAO
						.findCategoriaServicioById(rs
								.getShort("id_subcategoria_servicio")));
				listFactorTO.add(factorDAO.findFactorById(rs
						.getInt("id_factor")));

			}
			if (listIdTipoServicio != null) {
				
				Integer[] arrIdTipoServicio = (Integer[])listIdTipoServicio.toArray(new Integer[listIdTipoServicio.size()]);
				CategoriaServicioTO[] arrSubCategoriaTO = (CategoriaServicioTO[])listSubCategoriaTO.toArray(new CategoriaServicioTO[listSubCategoriaTO.size()]);
				FactorTO[] arrFactorTO = (FactorTO[])listFactorTO.toArray(new FactorTO[listFactorTO.size()]);
				
				tipoServicioTO = new TipoServicioTO(
						arrIdTipoServicio,
						categoriaServicioDAO
								.findCategoriaServicioById(idCategoriaServicio),
						arrSubCategoriaTO, arrFactorTO);
			}
			ps.close();
			conexion.close();
			return tipoServicioTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public TipoServicioTO selectTipoServicioByFactor(int idFactor) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			
			CategoriaServicioDAO categoriaServicioDAO = null;
			FactorDAO factorDAO = null;

			ArrayList<Integer> listIdTipoServicio = null;
			ArrayList<CategoriaServicioTO> listSubCategoriaTO = null;
			ArrayList<CategoriaServicioTO> listCategoriaServicioTO = null;

			TipoServicioTO tipoServicioTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYFACTOR);
			ps.setInt(1, idFactor);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdTipoServicio == null) {

					listIdTipoServicio = new ArrayList<Integer>();
					listCategoriaServicioTO = new ArrayList<CategoriaServicioTO>();
					listSubCategoriaTO = new ArrayList<CategoriaServicioTO>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					categoriaServicioDAO = fabricaMySQL
							.getCategoriaServicioDAO();
					factorDAO = fabricaMySQL.getFactorDAO();
				}

				listIdTipoServicio.add(rs.getInt("id_tipo_servicio"));
				listCategoriaServicioTO.add(categoriaServicioDAO
						.findCategoriaServicioById(rs
								.getShort("id_categoria_servicio")));
				listSubCategoriaTO.add(categoriaServicioDAO
						.findCategoriaServicioById(rs
								.getShort("id_subcategoria_servicio")));

			}
			if (listIdTipoServicio != null) {
				

				Integer[] arrIdTipoServicio = (Integer[])listIdTipoServicio.toArray(new Integer[listIdTipoServicio.size()]);
				CategoriaServicioTO[] arrSubCategoriaTO = (CategoriaServicioTO[])listSubCategoriaTO.toArray(new CategoriaServicioTO[listSubCategoriaTO.size()]);
				CategoriaServicioTO[] arrCategoriaServicioTO = (CategoriaServicioTO[])listCategoriaServicioTO.toArray(new CategoriaServicioTO[listCategoriaServicioTO.size()]);

				tipoServicioTO = new TipoServicioTO(arrIdTipoServicio,
						arrCategoriaServicioTO, arrSubCategoriaTO, factorDAO
								.findFactorById(idFactor));
			}
			ps.close();
			conexion.close();
			return tipoServicioTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public TipoServicioTO selectTipoServicioBySubCategoria(short idSubCategoria) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			
			CategoriaServicioDAO categoriaServicioDAO = null;
			FactorDAO factorDAO = null;

			ArrayList<Integer> listIdTipoServicio = null;

			ArrayList<CategoriaServicioTO> listCategoriaServicioTO = null;
			ArrayList<FactorTO> listFactorTO = null;

			TipoServicioTO tipoServicioTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYSUBCATEGORIA);
			ps.setShort(1, idSubCategoria);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdTipoServicio == null) {

					listIdTipoServicio = new ArrayList<Integer>();

					listCategoriaServicioTO = new ArrayList<CategoriaServicioTO>();
					listFactorTO = new ArrayList<FactorTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					categoriaServicioDAO = fabricaMySQL
							.getCategoriaServicioDAO();
					factorDAO = fabricaMySQL.getFactorDAO();
				}

				listIdTipoServicio.add(rs.getInt("id_tipo_servicio"));
				listCategoriaServicioTO.add(categoriaServicioDAO
						.findCategoriaServicioById(rs
								.getShort("id_categoria_servicio")));
				listFactorTO.add(factorDAO.findFactorById(rs
						.getInt("id_factor")));

			}
			if (listIdTipoServicio != null) {
				
				Integer[] arrIdTipoServicio = (Integer[])listIdTipoServicio.toArray(new Integer[listIdTipoServicio.size()]);
				CategoriaServicioTO[] arrCategoriaServicioTO = (CategoriaServicioTO[])listCategoriaServicioTO.toArray(new CategoriaServicioTO[listCategoriaServicioTO.size()]);
				FactorTO[] arrFactorTO = (FactorTO[])listFactorTO.toArray(new FactorTO[listFactorTO.size()]);
				
				tipoServicioTO = new TipoServicioTO(arrIdTipoServicio,
						arrCategoriaServicioTO, categoriaServicioDAO
								.findCategoriaServicioById(idSubCategoria),
						arrFactorTO);
			}
			ps.close();
			conexion.close();
			return tipoServicioTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updateTipoServicio(TipoServicioTO tipoServicioTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setShort(1, tipoServicioTO.getCategoriaServicioTO()
					.getIdCategoriaServicio());
			ps.setShort(2, tipoServicioTO.getCategoriaServicioTO()
					.getIdCategoriaServicio());
			ps.setInt(3, tipoServicioTO.getFactorTO().getIdFactor());
			ps.setInt(4, tipoServicioTO.getIdTipoServicio());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

}
